#!/usr/bin/python
from Tkinter import *
import socket
import threading
import string
import time
import shlex, subprocess
import matplotlib
import pylab

stringplot = {}
def fun_ejecutora(cant_top, claves, archivos_para_programa):
    if windows == 1:
        comando = "buscador.exe "
    else:
        comando = "./buscador " 
    comando+= str(tipo_norma) + " " +str(tipo_algoritmo) + " "+str(ano_desde) + " "+str(ano_hasta) + " "
    comando+= str(cant_top) + " " + str(len(claves))
    for x in claves:
        comando += " " + str(x.replace(" ","_"))
    comando += " " + str(len(archivos_para_programa))
    for x in archivos_para_programa:
        comando += " " + str(x) 
    print "se ejecutara:", comando
    args = shlex.split(comando)
    print args
    p = subprocess.Popen(args, stdout = subprocess.PIPE)
    if arch_salida == "":
        #print p.communicate()[0]
        ss = p.communicate()[0]
        primer_plot = ss.find("-PLOT:");
        print ss[0:primer_plot]
        if (primer_plot != -1):
            print "desde python: la informacion de los plot no se muestra" 
        
        ss = ss[primer_plot:];
        l = ss.split("\n");
        for x in l:
            ll = x.split(" ")
            if (len(ll) > 5):
                palabra = ll[1];
                ini = int(ll[2]);
                fin = int(ll[4]);
            
                lista_numeros = [];
                for i in range(5,len(ll)):
                    lista_numeros.append(float(ll[i]));
                if not(stringplot.has_key(palabra)):
                    print "agregado al plot:", palabra, "desde", ini ,"hasta", fin,"/ultimo Ele:",lista_numeros[-1];
                    stringplot[palabra] = lista_numeros;
            
    else:
        f = open(arch_salida,"w")
        f.write(p.communicate()[0])
        f.close()
    print "termino"
    

tipo_norma = 1
tipo_algoritmo = 1
tipo_memoria = 1
windows = 1
mostrar_logs = True
archivos = []
palabras = []
cant_mostrar = 10
ano_desde = 1800
ano_hasta = 2008
arch_salida = ""





def Tipo_uso_memoria(selection):
    global tipo_memoria
    
    if selection == 'Normal':
        tipo_memoria = 0
        print "proximamente..."
    elif selection == "Ahorrar Memoria (timeX2)":
        tipo_memoria = 1
    elif selection == "Fast & Ahorro memoria":
        tipo_memoria = 2
        print "proximamente..."
        
   
    return
def Tipo_correlacion(selection):
    global tipo_algoritmo
    if selection == 'Jony':
        tipo_algoritmo = 0
    elif selection == "galerazo":
        tipo_algoritmo = 1
    elif selection == "falta":
        tipo_algoritmo = 2
        print "proximamente..."
        
   
    return

def sistema_operativo(selection):
    global windows
    if selection == 'Windows':
        windows = 1
    elif selection == "Linux":
        windows = 0
    elif selection == "MAC":
        print "esperar la version 16.8" 
        
   
    return
def help_botton_fun():
    print "proximamente..."
    return 
def Tipo_de_Normalizacion(selection):
    global tipo_norma
    if selection == 'Normalizar[0,1] ':
        tipo_norma = 0
    elif selection == "Normalizar[-1,1]":
        tipo_norma = 1
    elif selection == "Sin Normalizar ":
        tipo_norma = 2
    elif selection == "otros?         ":
        print "proximamente en los mejores cines"
    return

def aboutMe():
    
    return


def load_estado_botton_fun():
    global palabras
    global archivos
    global cant_mostrar
    f = open("UltimoEstado.tkb","r")
    ss = f.read()
    #print ss
    f.close()
    l = ss.split('\n')
    tipo_norma = int(l[0])
    tipo_algoritmo = int(l[1])
    tipo_memoria = int(l[2])
    windows = int(l[3])
    palabras = eval(l[4])
    Palabras_claves_text.delete("0.1", END)
    entro = False
    for x in palabras:
        if entro:
            Palabras_claves_text.insert(END, "\n")
        entro = True
        Palabras_claves_text.insert(END, x)
    archivos = eval(l[5])
    archivos_text.delete("0.1", END)
    entro = False
    for x in archivos:
        if entro:
            archivos_text.insert(END, "\n")
        entro = True
        archivos_text.insert(END, x )
    
    cant_mostrar_Entry.delete(0, END)
    cant_mostrar_Entry.insert(0, l[6])
    ano_desde_Entry.delete(0, END)    
    ano_desde_Entry.insert(0, l[7])    
    ano_hasta_Entry.delete(0, END)
    ano_hasta_Entry.insert(0, l[8])
    arch_salida_Entry.delete(0, END)
    arch_salida_Entry.insert(0, l[9])
    
    # falta modificar las multi opciones para que muestren lo que deberian
    
    
    
    return
def actualizar_variables():
    global cant_mostrar
    global ano_desde
    global ano_hasta
    global arch_salida
    global palabras
    global archivos
    cant_mostrar  = cant_mostrar_Entry.get()
    ano_desde = ano_desde_Entry.get()
    ano_hasta = ano_hasta_Entry.get()
    arch_salida = arch_salida_Entry.get()
    palabras = Palabras_claves_text.get("0.1",END).split("\n")
    if palabras[-1] == "":
        palabras.pop()
   # print palabras
    archivos = archivos_text.get("0.1",END).split("\n")
    if archivos[-1] == "":
        archivos.pop()
    
    #print archivos[0]
    return
def save_estado_botton_fun():
    actualizar_variables()
    f = open("UltimoEstado.tkb","w")
    f.write(str(tipo_norma) + "\n")
    f.write(str(tipo_algoritmo) + "\n")
    f.write(str(tipo_memoria) +"\n")
    f.write(str(windows) + "\n")
    f.write(str(palabras) + "\n")
    f.write(str(archivos) + "\n")
    f.write(str(cant_mostrar) +"\n")
    f.write(str(ano_desde) +"\n")
    f.write(str(ano_hasta) +"\n")
    f.write(str(arch_salida) +"\n")
    f.close()
    #root.quit()
    return
def boom_botton_fun():
    print "vos estas loco pibe? como vas a detonar una bomba nuclear? mira si el presidente de los estados unidos ve el mismo boton y se le ocurre apretarlo a ver que pasa??.. pensalo, y para la proxima no apretes el boton"
    return
def clear_botton_fun():
    Logs.delete("0.1",END)
    return
def mostrar_logs_botton_fun():
    global mostrar_logs
    if mostrar_logs:
        print "Mostrar Logs = False"
        mostrar_logs = False
        sys.stdout = sys.__stdout__
    else:        
        mostrar_logs = True
        sys.stdout = StdoutRedirector( Logs )
        print "Mostrar Logs = True"
    return
def crear_hilo():
    actualizar_variables()
    t = threading.Thread(target = fun_ejecutora, args=(cant_mostrar,palabras, archivos))
    print "arranco el proceso"
    t.start()
    
    return
def plotlista():
   # for x in lista:
    lista = []
    candi = plot0.get()
    if  candi != "":
        
        if stringplot.has_key(candi):
            pylab.plot(stringplot[candi])
            lista.append(candi)
        else:
            print "0-palabra", candi, "no se encuentra guardada para plotear"
    candi = plot1.get()
    if  candi != "":
        pylab.plot(stringplot[candi])
        if stringplot.has_key(candi):
            lista.append(candi)
        else:
            print "1-palabra", candi, "no se encuentra guardada para plotear"
    candi = plot2.get()
    if  candi != "":
        if stringplot.has_key(candi):
            pylab.plot(stringplot[candi])
            lista.append(candi)
        else:
            print "2-palabra", candi, "no se encuentra guardada para plotear"
    candi = plot3.get()
    if  candi != "":
        if stringplot.has_key(candi):
            pylab.plot(stringplot[candi])
            lista.append(candi)
        else:
            print "3-palabra", candi, "no se encuentra guardada para plotear"
    if len(lista) > 0:        
        print "arranco plot"
        pylab.show()
    else:
        print "nada para plotear"
def plot_botton_fun():
    t = threading.Thread(target = plotlista, args=())
    t.start()

    
    
    
#chanchada para redireccionar stdout a los logs
class StdoutRedirector():
    def __init__(self,text_area):
        self.text_area = text_area
    def write(self,str_nuevo):
        self.text_area.insert(END,str_nuevo)
        self.text_area.see(END)
#fin chanchada

    
#crear vetanita con botones bonitos
root = Tk()
root.title("con interfaz grafica y todo papa")
frame = Frame(root)
frame.pack()
#root.geometry("560x460+200+200")
menubar = Menu(frame)
filemenu = Menu(menubar,tearoff=0)
#filemenu.add_command(label="Open Archivos",command=openArchivos)
#filemenu.add_command(label="Open Palabras Claves", command=openPalabras)
#filemenu.add_command(label="Open Hilos", command=openHilos)

filemenu.add_separator()

filemenu.add_command(label="Quit", command=root.quit)
menubar.add_cascade(label="File",menu=filemenu)

helpmenu = Menu(menubar, tearoff=0)
helpmenu.add_cascade(label="About Me", command=aboutMe)
menubar.add_cascade(label="Help",menu=helpmenu)

root.config(menu=menubar)

Lalbel_palabras = Label(frame, text="Palabras a buscar:")
Lalbel_palabras.grid(row=1, column=3,columnspan=1)
Palabras_claves_text = Text(frame,width = 16, height = 8)
Palabras_claves_text.insert(END, "Jazz")
Palabras_claves_text.grid(row=2, column=3,columnspan=1,rowspan=3)


Lalbel_archivos = Label(frame, text="archivos donde buscar:")
Lalbel_archivos.grid(row=1, column=4,columnspan=1)
archivos_text = Text(frame,width = 16, height = 8)
archivos_text.insert(END, "1grams.out")
archivos_text.grid(row=2, column=4,columnspan=1,rowspan=3)

Logs = Text(frame,width = 75, height = 20)
Logs.insert(END, "\nLogs Del Programa \n")
Logs.grid(row=7,columnspan=6,padx=15,pady=15)

studFiles = StringVar()
studFiles.set('Normalizar[-1,1]')
files = ['Normalizar[0,1] ',
         "Normalizar[-1,1]",
         "Sin Normalizar ",
         "otros?         "]
studDropDown = OptionMenu(frame, studFiles, *files, command=Tipo_de_Normalizacion).grid(row=3, column=0,columnspan=1)
studFiles2 = StringVar()
studFiles2.set('Ahorrar Memoria (timeX2)')
files2 = ['Normal',
         'Ahorrar Memoria (timeX2)',
         "Fast & Ahorro memoria"
         ]
studDropDown = OptionMenu(frame, studFiles2, *files2, command=Tipo_uso_memoria).grid(row=3, column=1,columnspan=2)

studFiles3 = StringVar()
studFiles3.set('Windows')
files3 = ['Windows',
         "Linux",
         "MAC"]
studDropDown = OptionMenu(frame, studFiles3, *files3, command=sistema_operativo).grid(row=4, column=0,columnspan=1)

studFiles4 = StringVar()
studFiles4.set('Tipo De Correlacion')
files4 = ['Jony',
         'galerazo',
         "falta"
         ]
studDropDown = OptionMenu(frame, studFiles4, *files4, command=Tipo_correlacion).grid(row=4, column=1,columnspan=2)

#help_botton = Button(frame, text="Help!!!", width = 16, command=help_botton_fun)
#help_botton.grid(row=4, column=1,columnspan=2,padx=3,pady=3)

#comando_Entry = Entry(frame,width = 35)
#enviar_comando = Button(frame, text="Enviar Comando!", width = 16, command=comando_nuevo)
#enviar_comando.grid(row=2, column=4,columnspan=2)
#comando_Entry.grid(row=1, column=4,columnspan=2)


#articulo_Entry = Entry(frame,width = 35)
#add_botton = Button(frame, text="add palabra clave", width = 16, command=add_articulo)
#remove_botton = Button(frame, text="remove", width = 16, command=remove_articulo)
#add_botton.grid(row=1, column=0,columnspan=1,padx=3,pady=3)
#remove_botton.grid(row=1, column=1,columnspan=1,padx=3,pady=3)
#articulo_Entry.grid(row=0, column=0,columnspan=2)
#remove_todo_botton = Button(frame, text="rm todo", width = 16, command=remove_todo_botton_fun)
#remove_todo_botton.grid(row=2, column=1,columnspan=1,padx=3,pady=3)


#User_Entry = Entry(frame,width = 35)
#User_Entry.grid(row=4, column=0,columnspan=2)
#add_user_botton = Button(frame, text="agregar archivo", width = 16, command=add_user_botton_fun)
#add_user_botton.grid(row=5, column=0,columnspan=1,padx=3,pady=3)
#remove_user_botton = Button(frame, text="remover archivo", width = 16, command=remove_user_botton_fun)
#remove_user_botton.grid(row=5, column=1,columnspan=1,padx=3,pady=3)
#remove_todo_user_botton = Button(frame, text="remover todo", width = 16, command=remove_todo_user_botton_fun)
#remove_todo_user_botton.grid(row=6, column=1,columnspan=1,padx=3,pady=3)




#parte inferior
hilo_nuevo_botton = Button(frame, text="Iniciar Busqueda", width = 18, command=crear_hilo)
hilo_nuevo_botton.grid(row=8, column=0,columnspan=1,padx=3,pady=3)
clear_botton = Button(frame, text="clear", width = 16, command=clear_botton_fun)
clear_botton.grid(row=8, column=3,columnspan=1,padx=3,pady=3)
mostrar_logs_botton = Button(frame, text="Mostrar Logs", width = 16, command=mostrar_logs_botton_fun)
mostrar_logs_botton.grid(row=8, column=2,columnspan=1,padx=3,pady=3)
ping_botton = Button(frame, text="Quit", width = 16, command=root.quit)
ping_botton.grid(row=8, column=4,columnspan=1,padx=3,pady=3)
save_estado_botton = Button(frame, text="Save", width = 16, command=save_estado_botton_fun)
save_estado_botton.grid(row=5, column=4,columnspan=1,padx=3,pady=3)
load_estado_botton = Button(frame, text="Load", width = 16, command=load_estado_botton_fun)
load_estado_botton.grid(row=5, column=3,columnspan=1,padx=3,pady=3)


Lalbel_cant_mostrar = Label(frame, text="cantidad a mostrar:")
Lalbel_cant_mostrar.grid(row=2, column=0,columnspan=2)
cant_mostrar_Entry = Entry(frame,width = 8)
cant_mostrar_Entry.delete(0, END)
cant_mostrar_Entry.insert(0, "10")
cant_mostrar_Entry.grid(row=2, column=2,columnspan=1)

Lalbel_ano = Label(frame, text="a~nos:")
Lalbel_ano.grid(row=1, column=0,columnspan=1)
ano_desde_Entry = Entry(frame,width = 8)
ano_desde_Entry.grid(row=1, column=1,columnspan=1)
ano_desde_Entry.insert(0, "1800")
ano_hasta_Entry = Entry(frame,width = 8)
ano_hasta_Entry.grid(row=1, column=2,columnspan=1)
ano_hasta_Entry.insert(0, "2008")


Lalbel_cant_mostrar = Label(frame, text="Archivo de Salida:")
Lalbel_cant_mostrar.grid(row=5, column=0,columnspan=2)
arch_salida_Entry = Entry(frame,width = 16)
arch_salida_Entry.delete(0, END)
arch_salida_Entry.insert(0, "")
arch_salida_Entry.grid(row=5, column=1,columnspan=2)


Lalbel_ano = Label(frame, text="PLOT:")
Lalbel_ano.grid(row=1, column=6,columnspan=1)

plot0 = Entry(frame,width = 16)
plot0.grid(row=2, column=6,columnspan=1,padx=8)
plot1 = Entry(frame,width = 16)
plot1.grid(row=3, column=6,columnspan=1,padx=8)
plot2 = Entry(frame,width = 16)
plot2.grid(row=4, column=6,columnspan=1,padx=8)
plot3 = Entry(frame,width = 16)
plot3.grid(row=5, column=6,columnspan=1,padx=8)
plot_botton = Button(frame, text="Plot", width = 16, command=plot_botton_fun)
plot_botton.grid(row=7, column=6,columnspan=1,padx=3,pady=3)

#set_cookies_botton = Button(frame, text="set_Cant_mostrar", width = 16, command=set_cookies)
#set_cookies_botton.grid(row=5, column=5,columnspan=1,padx=3,pady=3)


sys.stdout = StdoutRedirector( Logs )
root.mainloop()
sys.stdout = sys.__stdout__

